package com.lanjiu.lib.communication.interf;

import com.lanjiu.pro.business.BusinessProtocolMessageStandard;
import com.lanjiu.lib.communication.callback.OnConnectStatusCallback;
import com.lanjiu.lib.communication.dispatcher.MsgDispatcher;
import com.lanjiu.lib.communication.event.OnEventListener;
import com.lanjiu.lib.communication.timer.MsgTimeoutTimerManager;
import com.lanjiu.lib.communication.timer.RequestTimeoutTimerManager;
import com.lanjiu.lib.communication.work.ExecutorServiceFactory;

/**
 * @description: ims抽象接口，需要切换到其它方式实现im功能，实现此接口即可
 * @author: Panwei
 * @date: 2019/10/28 14:30
 */
public interface IMSClientInterface {

    /**
     * 初始化
     *
     * @param serverUrl 服务器地址列表
     * @param listener  与应用层交互的listener
     */
    void init(String serverUrl, OnEventListener listener, OnConnectStatusCallback callback);

    /**
     * 从应用层获取网络是否可用
     *
     * @return
     */
    boolean isNetworkAvailable();

    /**
     * 重置连接，也就是重连
     * 首次连接也可认为是重连
     */
    void connect();

    /**
     * 重置连接，也就是重连
     * 首次连接也可认为是重连
     * 重载
     */
    void resetConnect();

    /**
     * 是否连接中
     *
     * @return
     */
    boolean isConnect();

    /**
     * 关闭连接，同时释放资源
     */
    boolean close();

    /**
     * 标识ims是否已关闭
     *
     * @return
     */
    boolean isClosed();

    /**
     * 发送消息
     *
     * @param msg
     */
    void sendMsg(BusinessProtocolMessageStandard.CheckUnifiedEntranceMessage msg);

    /**
     * 发送消息
     * 重载
     *
     * @param msg
     * @param isJoinTimeoutManager 是否加入发送超时管理器
     */
    void sendMsg(BusinessProtocolMessageStandard.CheckUnifiedEntranceMessage msg, boolean isJoinTimeoutManager);

    /**
     * 发送业务请求
     *
     * @param msg
     */
    void sendRequestMsg(BusinessProtocolMessageStandard.CheckUnifiedEntranceMessage msg);

    /**
     * 获取重连间隔时长
     *
     * @return
     */
    int getReconnectInterval();

    /**
     * 获取连接超时时长
     *
     * @return
     */
    int getConnectTimeout();

    /**
     * 获取应用层消息发送超时重发次数
     *
     * @return
     */
    int getResendCount();

    /**
     * 获取应用层消息发送超时重发间隔
     *
     * @return
     */
    int getResendInterval();

    /**
     * 获取请求超时时长
     *
     * @return
     */
    int getRequestTimeoutMillis();

    /**
     * 设置连接回调
     *
     * @param callback
     */
    void setConnectStatusCallback(OnConnectStatusCallback callback);

    /**
     * 获取消息转发器
     *
     * @return
     */
    MsgDispatcher getMsgDispatcher();

    /**
     * 获取消息发送超时定时器
     *
     * @return
     */
    MsgTimeoutTimerManager getMsgTimeoutTimerManager();

    /**
     * 获取请求消息超时定时器
     *
     * @return
     */
    RequestTimeoutTimerManager getRequestTimeoutTimerManager();

    /**
     * 获取线程池
     *
     * @return
     */
    ExecutorServiceFactory getLoopGroup();
}
